﻿#ifndef PST_CALCULATIONFORMULAFUNCTION_H
#define PST_CALCULATIONFORMULAFUNCTION_H

#include <QString>
#include <QVector>
#include <QHash>

namespace pst
{
    using CalculationData = QPair<QVector<double>, QVector<double>>;                       // 计算结构，first为value，second为key,second为空的情况下代表是纯计算数值，不是曲线,比如+5,-3这些
    using Func = bool (*)(const QVector<CalculationData>& value, CalculationData& result); // 计算函数截止重名

    Func GetSymbolicOperationFunc(const QString& funcName); // 获取符号计算函数

    QStringList GetFormulaFuncNames();            // 获取支持的数学计算函数名称列表
    Func GetFormulaFunc(const QString& funcName); // 获取数学计算函数

    QStringList GetConstantNames();                      // 获取内置常量名称列表
    double GetConstanValue(const QString& constantName); // 获取内置常量

    bool Add(const QVector<CalculationData>& value, CalculationData& result);      // 加
    bool Subtract(const QVector<CalculationData>& value, CalculationData& result); // 减
    bool Multiply(const QVector<CalculationData>& value, CalculationData& result); // 乘
    bool Divide(const QVector<CalculationData>& value, CalculationData& result);   // 除
    bool Power(const QVector<CalculationData>& value, CalculationData& result);    // 指数

    bool Average(const QVector<CalculationData>& value, CalculationData& result); // 平均值
    bool Max(const QVector<CalculationData>& value, CalculationData& result);     // 最大值
    bool Min(const QVector<CalculationData>& value, CalculationData& result);     // 最小值
    bool Sqrt(const QVector<CalculationData>& value, CalculationData& result);    // 平方根
    bool Exp(const QVector<CalculationData>& value, CalculationData& result);     // 自然指数
    bool Ln(const QVector<CalculationData>& value, CalculationData& result);      // 自然对数
    bool Abs(const QVector<CalculationData>& value, CalculationData& result);     // 绝对值
    bool Log(const QVector<CalculationData>& value, CalculationData& result);     // 10为底的对数
    bool Sin(const QVector<CalculationData>& value, CalculationData& result);     // sin函数
    bool Cos(const QVector<CalculationData>& value, CalculationData& result);     // cos函数
    bool Tan(const QVector<CalculationData>& value, CalculationData& result);     // tan函数
    bool ASin(const QVector<CalculationData>& value, CalculationData& result);    // asin函数
    bool ACos(const QVector<CalculationData>& value, CalculationData& result);    // acos函数
    bool ATan(const QVector<CalculationData>& value, CalculationData& result);    // atan函数
} // namespace pst
#endif // PST_CALCULATIONFORMULAFUNCTION_H
